package practice10;

import java.util.ArrayList;
import java.util.Collections;

/**
 * ## 题目
 *
 * 给定一个字符串，其中仅包含，大小写字母，数字和问号。要求对该字符串内部字符排序，满足以下要求：
 * 1. 问号的占用的位置不变
 * 2. 数字占用的位置不变，数字之间由大到小排序
 * 3. 字母占用的位置不变，字母之间按字典序排序
 *
 * 具体请配合样例理解
 *
 * ## 样例
 *
 * ### 输入：
 * 12A?zc
 *
 * ### 输出：
 * 21A?cz
 *
 * ### 输入：
 * 1Ad?z?t24
 *
 * ### 输出：
 * 4Ad?t?z21
 *
 * ### 输入：
 * ???123??zxy?
 *
 * ### 输出：
 * ???321??xyz?
 */
public class Main {
    public static String solution(String inp) {
        // Edit your code here
        ArrayList<Character> digits = new ArrayList<>();
        ArrayList<Character> letters = new ArrayList<>();

        // 分离并排序数字和字母
        for (char c : inp.toCharArray()) {
            if (Character.isDigit(c)) {
                digits.add(c);
            } else if (Character.isLetter(c)) {
                letters.add(c);
            }
        }
        Collections.sort(digits, Collections.reverseOrder());
        Collections.sort(letters);

        // 构建结果字符串
        StringBuilder result = new StringBuilder();
        int digitIndex = 0, letterIndex = 0;
        for (char c : inp.toCharArray()) {
            if (Character.isDigit(c)) {
                result.append(digits.get(digitIndex++));
            } else if (Character.isLetter(c)) {
                result.append(letters.get(letterIndex++));
            } else {
                result.append(c);
            }
        }

        return result.toString();
        //return "ABH";
    }

    public static void main(String[] args) {
        // Add your test cases here
        
        System.out.println(solution("12A?zc").equals("21A?cz"));
        System.out.println(solution("1Ad?z?t24").equals("4Ad?t?z21"));
        System.out.println(solution("???123??zxy?").equals("???321??xyz?"));
    }
}
